æ¡ä»¶ä»ãã«ã¹ã±ãŒãã¬ã€ã€ãŒã®ã¢ã¯ãã£ããŒã·ã§ã³ã«ããé«åºŠãªCSSã¢ãŒããã¯ãã£ãæ¢æ±ããŸãããã¥ãŒããŒããããŒãããŠãŒã¶ãŒã¹ããŒããªã©ã®ã³ã³ããã¹ãã«åºã¥ããŠã¹ã¿ã€ã«ãèªã¿èŸŒã¿ãããé«éã§ä¿å®æ§ã®é«ãWebã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããæ¹æ³ãåŠã³ãŸãããã
CSSã«ã¹ã±ãŒãã¬ã€ã€ãŒã®æ¡ä»¶ä»ãã¢ã¯ãã£ããŒã·ã§ã³ïŒã³ã³ããã¹ã察å¿ã¹ã¿ã€ãªã³ã°ã®åŸ¹åºè§£èª¬
äœå幎ãã®éãå€§èŠæš¡ãªCSSã®ç®¡çã¯Webéçºã«ãããæãæ ¹åŒ·ã課é¡ã®äžã€ã§ãããç§ãã¡ã¯ã°ããŒãã«ãªã¹ã¿ã€ã«ã·ãŒãã®ãç¡æ³å°åž¯ããããBEMã®ãããªæ§é åãããæ¹æ³è«ãžããããŠSassã®ãããªããªããã»ããµããCSS-in-JSã«ããã³ã³ããŒãã³ãã¹ã³ãŒãã®ã¹ã¿ã€ã«ãžãšæ ãããŠããŸãããããããã®é²åã¯ãCSSã®è©³çŽ°åºŠãšã°ããŒãã«ã«ã¹ã±ãŒããšããåä»ãªåé¡ã飌ããªããããšãç®æããŠããŸãããCSSã«ã¹ã±ãŒãã¬ã€ã€ãŒïŒ@layerïŒã®å°å ¥ã¯ãéçºè ã«ã«ã¹ã±ãŒãã«å¯Ÿããæç¢ºãªå¶åŸ¡æš©ãäžããèšå¿µç¢çãªäžæ©ã§ããããããããã®å¶åŸ¡ãããã«äžæ©é²ããããšãã§ãããã©ãã§ããããïŒã¹ã¿ã€ã«ãé åºä»ããã ãã§ãªãããŠãŒã¶ãŒã®ã³ã³ããã¹ãã«åºã¥ããŠæ¡ä»¶ä»ãã§ã¢ã¯ãã£ããŒãã§ãããã©ãã§ããããïŒãããçŸä»£ã®CSSã¢ãŒããã¯ãã£ã®æåç·ãããªãã¡ã³ã³ããã¹ã察å¿ã®ã¬ã€ã€ãŒèªã¿èŸŒã¿ã§ãã
æ¡ä»¶ä»ãã¢ã¯ãã£ããŒã·ã§ã³ãšã¯ãå¿ èŠãªå Žåã«ã®ã¿CSSã¬ã€ã€ãŒãèªã¿èŸŒãã ãé©çšãããããå®è·µã§ãããã®ã³ã³ããã¹ãã¯ããŠãŒã¶ãŒã®ãã¥ãŒããŒããµã€ãºã奜ã¿ã®ã«ã©ãŒã¹ããŒã ããã©ãŠã¶ã®æ©èœããããã¯JavaScriptã«ãã£ãŠç®¡çãããã¢ããªã±ãŒã·ã§ã³ã®ç¶æ ãªã©ãäœã§ãããåŸãŸãããã®ã¢ãããŒããåãå ¥ããããšã§ãç§ãã¡ã¯ããæŽçãããã ãã§ãªããèããããã©ãŒãã³ã¹ã®é«ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããç¹å®ã®ãŠãŒã¶ãŒäœéšã«å¿ èŠãªã¹ã¿ã€ã«ã®ã¿ãé ä¿¡ããããšãã§ããŸãããã®èšäºã§ã¯ãçã«ã°ããŒãã«ã§æé©åãããWebã®ããã«ãCSSã«ã¹ã±ãŒãã¬ã€ã€ãŒãæ¡ä»¶ä»ãã§ã¢ã¯ãã£ããŒãããèåŸã«ããæŠç¥ãšå©ç¹ãå æ¬çã«æ¢æ±ããŸãã
åºç€ã®çè§£ïŒCSSã«ã¹ã±ãŒãã¬ã€ã€ãŒã®ç°¡åãªåŸ©ç¿
æ¡ä»¶ä»ãããžãã¯ã«é£ã³èŸŒãåã«ãCSSã«ã¹ã±ãŒãã¬ã€ã€ãŒãšã¯äœãããããŠããã解決ããåé¡ã«ã€ããŠãã£ãããšææ¡ããããšãäžå¯æ¬ ã§ãããã®æ žå¿ã«ãããŠã@layerã¢ããã«ãŒã«ã¯éçºè ãååä»ãã¬ã€ã€ãŒãå®çŸ©ããã¹ã¿ã€ã«ã«å¯ŸããŠæç¢ºã§é åºä»ãããããã±ããäœæããããšãå¯èœã«ããŸãã
ã¬ã€ã€ãŒã®äž»ãªç®çã¯ã«ã¹ã±ãŒãã管çããããšã§ããåŸæ¥ã詳现床ã¯ã»ã¬ã¯ã¿ã®è€éããšãœãŒã¹é ã®çµã¿åããã«ãã£ãŠæ±ºå®ãããŠããŸãããããã¯ãã°ãã°ã詳现床æŠäºãã«ã€ãªãããéçºè ã¯ã¹ã¿ã€ã«ãäžæžãããããã ãã«ããŸããŸãè€éãªã»ã¬ã¯ã¿ïŒäŸïŒ#sidebar .user-profile .avatarïŒãæžããããæããã!importantã«é Œã£ããããŠããŸãããã¬ã€ã€ãŒã¯ã«ã¹ã±ãŒãã«ããã匷åãªæ°ããåºæºãããªãã¡ã¬ã€ã€ãŒã®é åºãå°å ¥ããŸãã
ã¬ã€ã€ãŒãå®çŸ©ãããé åºãããã®åªå é äœã決å®ããŸããåŸã§å®çŸ©ãããã¬ã€ã€ãŒå ã®ã¹ã¿ã€ã«ã¯ãã»ã¬ã¯ã¿ã®è©³çŽ°åºŠã«é¢ä¿ãªããå ã«å®çŸ©ãããã¬ã€ã€ãŒå ã®ã¹ã¿ã€ã«ãäžæžãããŸãããã®ç°¡åãªèšå®ãèããŠã¿ãŠãã ããïŒ
// ã¬ã€ã€ãŒã®é åºãå®çŸ©ããŸãããããå¯äžã®ä¿¡é Œã§ããæ
å ±æºã§ãã
@layer reset, base, components, utilities;
// 'components' ã¬ã€ã€ãŒã®ã¹ã¿ã€ã«
@layer components {
.button {
background-color: blue;
padding: 10px 20px;
}
}
// 'utilities' ã¬ã€ã€ãŒã®ã¹ã¿ã€ã«
@layer utilities {
.bg-red {
background-color: red;
}
}
ãã®äŸã§ã¯ãããããªãã<button class="button bg-red">Click Me</button>ã®ãããªèŠçŽ ãæã£ãŠããå Žåããã¿ã³ã®èæ¯ã¯èµ€ã«ãªããŸãããªãã§ããããïŒããã¯utilitiesã¬ã€ã€ãŒãcomponentsã¬ã€ã€ãŒã®åŸã«å®çŸ©ãããããé«ãåªå é äœãäžããããŠããããã§ããåçŽãªã¯ã©ã¹ã»ã¬ã¯ã¿.bg-redã¯ãåãã»ã¬ã¯ã¿è©³çŽ°åºŠã§ããã«ãããããã.buttonãäžæžãããŸãããã®äºæž¬å¯èœãªå¶åŸ¡ããããç§ãã¡ãæ¡ä»¶ä»ãããžãã¯ãæ§ç¯ããåºç€ãšãªãã®ã§ãã
ããªããïŒæ¡ä»¶ä»ãã¢ã¯ãã£ããŒã·ã§ã³ã®éèŠãªå¿ èŠæ§
çŸä»£ã®Webã¢ããªã±ãŒã·ã§ã³ã¯éåžžã«è€éã§ãã倿§ãªããŒãºãšããã€ã¹ãæã€ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã«å¯Ÿå¿ãããããåºç¯ãªã³ã³ããã¹ãã«é©å¿ããªããã°ãªããŸããããã®è€éãã¯ãç§ãã¡ã®ã¹ã¿ã€ã«ã·ãŒãã«çŽæ¥åæ ãããŸãã
- ããã©ãŒãã³ã¹ã®ãªãŒããŒãããïŒèãããããã¹ãŠã®ã³ã³ããŒãã³ãã®ããªã¢ã³ããããŒããç»é¢ãµã€ãºã«å¯Ÿå¿ããã¹ã¿ã€ã«ãå«ãäžæå²©ã®CSSãã¡ã€ã«ã¯ããã©ãŠã¶ã«äœ¿çšãããªãå¯èœæ§ã®ãã倧éã®ã³ãŒããããŠã³ããŒããè§£æãè©äŸ¡ãããããšã«ãªããŸããããã¯First Contentful Paint (FCP)ã®ãããªäž»èŠãªããã©ãŒãã³ã¹ææšã«çŽæ¥åœ±é¿ããç¹ã«ã¢ãã€ã«ããã€ã¹ãã€ã³ã¿ãŒãããæ¥ç¶ãé ãå°åã§ã¯ããŠãŒã¶ãŒäœéšã®é å»¶ã«ã€ãªããå¯èœæ§ããããŸãã
- éçºã®è€éãïŒåäžã®å·šå€§ãªã¹ã¿ã€ã«ã·ãŒãã¯ãããã²ãŒããä¿å®ãå°é£ã§ããç·šéãã¹ãæ£ããã«ãŒã«ãèŠã€ããã®ã¯é¢åã§ãããæå³ããªãå¯äœçšãé »ç¹ã«çºçããŸããéçºè ã¯ãã°ãã°å€æŽãå ããããšãæããã念ã®ãããå€ãæªäœ¿çšã®ã¹ã¿ã€ã«ãæ®ãããã³ãŒãã®é³è åã«ã€ãªãããŸãã
- 倿§ãªãŠãŒã¶ãŒã³ã³ããã¹ãïŒç§ãã¡ã¯ãã¹ã¯ãããã®ããã ãã«æ§ç¯ããŠããããã§ã¯ãããŸãããã©ã€ãã¢ãŒããšããŒã¯ã¢ãŒãïŒprefers-color-schemeïŒãã¢ã¯ã»ã·ããªãã£ã®ããã®ãã€ã³ã³ãã©ã¹ãã¢ãŒããåãã®æå¶èšå®ïŒprefers-reduced-motionïŒãããã«ã¯å°å·å°çšã®ã¬ã€ã¢ãŠããŸã§ãµããŒãããå¿ èŠããããŸãããããã®ãã¹ãŠã®ããªãšãŒã·ã§ã³ãåŸæ¥ã®æ¹æ³ã§åŠçãããšãã¡ãã£ã¢ã¯ãšãªãšæ¡ä»¶ä»ãã¯ã©ã¹ã®è¿·è·¯ã«é¥ãå¯èœæ§ããããŸãã
æ¡ä»¶ä»ãã¬ã€ã€ãŒã¢ã¯ãã£ããŒã·ã§ã³ã¯ããšã¬ã¬ã³ããªè§£æ±ºçãæäŸããŸããããã¯ã³ã³ããã¹ãã«åºã¥ããŠã¹ã¿ã€ã«ãåå²ããããã®CSSãã€ãã£ããªã¢ãŒããã¯ãã£ãã¿ãŒã³ãæäŸããé¢é£ããã³ãŒãã®ã¿ãé©çšãããããã«ããããšã§ãããã¹ãªã ã§é«éããã€ä¿å®ããããã¢ããªã±ãŒã·ã§ã³ã«ã€ãªãããŸãã
ãã©ã®ããã«ãïŒæ¡ä»¶ä»ãã¬ã€ã€ãŒã¢ã¯ãã£ããŒã·ã§ã³ã®ãã¯ããã¯
ã¬ã€ã€ãŒã«ã¹ã¿ã€ã«ãæ¡ä»¶ä»ãã§é©çšãŸãã¯ã€ã³ããŒãããããã®ããã€ãã®åŒ·åãªãã¯ããã¯ããããŸããçŽç²ãªCSSãœãªã¥ãŒã·ã§ã³ããJavaScriptã§åŒ·åãããã¡ãœãããŸã§ãæã广çãªã¢ãããŒããæ¢ã£ãŠã¿ãŸãããã
ãã¯ããã¯1ïŒã¬ã€ã€ãŒããµããŒãããæ¡ä»¶ä»ã@import
@importã«ãŒã«ã¯é²åããŸãããã¡ãã£ã¢ã¯ãšãªãšå ±ã«äœ¿çšã§ããããã«ãªããéèŠãªããšã«ã@layerãããã¯å ã«é 眮ããããšãã§ããŸããããã«ãããç¹å®ã®æ¡ä»¶ãæºããããå Žåã«ã®ã¿ãã¹ã¿ã€ã«ã·ãŒãå šäœãç¹å®ã®ã¬ã€ã€ãŒã«ã€ã³ããŒãããããšãå¯èœã«ãªããŸãã
ããã¯ãç°ãªãç»é¢ãµã€ãºçšã®ã¬ã€ã¢ãŠãå šäœãªã©ãCSSã®å€§ããªå¡ãå¥ã ã®ãã¡ã€ã«ã«åå²ããã®ã«ç¹ã«äŸ¿å©ã§ããããã«ãããã¡ã€ã³ã®ã¹ã¿ã€ã«ã·ãŒããã¯ãªãŒã³ã«ä¿ãããã³ãŒãã®æŽçãä¿é²ãããŸãã
äŸïŒãã¥ãŒããŒãåºæã®ã¬ã€ã¢ãŠãã¬ã€ã€ãŒ
ã¢ãã€ã«ãã¿ãã¬ããããã¹ã¯ãããçšã«ç°ãªãã¬ã€ã¢ãŠãã·ã¹ãã ããããšæ³åããŠãã ãããããããã«ã¬ã€ã€ãŒãå®çŸ©ãã察å¿ããã¹ã¿ã€ã«ã·ãŒããæ¡ä»¶ä»ãã§ã€ã³ããŒãã§ããŸãã
// main.css
// ãŸããå®å
šãªã¬ã€ã€ãŒã®é åºã確ç«ããŸãã
@layer reset, base, layout-mobile, layout-tablet, layout-desktop, components;
// åžžã«ã¢ã¯ãã£ããªã¬ã€ã€ãŒ
@layer reset { @import url("reset.css"); }
@layer base { @import url("base.css"); }
// ã¬ã€ã¢ãŠãã¹ã¿ã€ã«ãããããã®ã¬ã€ã€ãŒã«æ¡ä»¶ä»ãã§ã€ã³ããŒãããŸã
@layer layout-mobile {
@import url("layout-mobile.css") (width <= 767px);
}
@layer layout-tablet {
@import url("layout-tablet.css") (768px <= width <= 1023px);
}
@layer layout-desktop {
@import url("layout-desktop.css") (width >= 1024px);
}
å©ç¹ïŒ
- é¢å¿ã®åªããåé¢ïŒåã³ã³ããã¹ãã®ã¹ã¿ã€ã«ãç¬èªã®ãã¡ã€ã«ã«ããããããããžã§ã¯ãæ§é ãæç¢ºã§ç®¡çãããããªããŸãã
- åæããŒããé«éã«ãªãå¯èœæ§ïŒãã©ãŠã¶ã¯çŸåšã®ã³ã³ããã¹ãã«äžèŽããã¹ã¿ã€ã«ã·ãŒãã®ã¿ãããŠã³ããŒãããå¿ èŠããããŸãã
èæ ®äºé ïŒ
- ãããã¯ãŒã¯ãªã¯ãšã¹ãïŒåŸæ¥ã@importã¯ã·ãŒã±ã³ã·ã£ã«ãªãããã¯ãŒã¯ãªã¯ãšã¹ããåŒãèµ·ãããã¬ã³ããªã³ã°ããããã¯ããå¯èœæ§ããããŸãããããããçŸä»£ã®ãã«ãããŒã«ïŒVite, Webpack, Parcelãªã©ïŒã¯è³¢ãã§ãããããã®@importã«ãŒã«ããã«ãæã«åŠçãããã¹ãŠãåäžã®æé©åãããCSSãã¡ã€ã«ã«ãã³ãã«ãã€ã€ãã¡ãã£ã¢ã¯ãšãªã«ããæ¡ä»¶ä»ãããžãã¯ãå°éããããšããããããŸãããã«ãã¹ãããã®ãªããããžã§ã¯ãã§ã¯ããã®ã¢ãããŒãã¯æ éã«äœ¿çšããå¿ èŠããããŸãã
ãã¯ããã¯2ïŒã¬ã€ã€ãŒãããã¯å ã®æ¡ä»¶ä»ãã«ãŒã«
ããããæãçŽæ¥çã§åºãé©çšå¯èœãªãã¯ããã¯ã¯ã@mediaã@supportsã®ãããªæ¡ä»¶ä»ãã¢ããã«ãŒã«ãã¬ã€ã€ãŒãããã¯ã®å éšã«é 眮ããããšã§ããæ¡ä»¶ä»ããããã¯å ã®ãã¹ãŠã®ã«ãŒã«ã¯ãåŒãç¶ããã®ã¬ã€ã€ãŒã«å±ããã«ã¹ã±ãŒãé ã«ããããã®äœçœ®ãå°éããŸãã
ãã®æ¹æ³ã¯ãããŒããã¬ã¹ãã³ã·ã調æŽãããã°ã¬ãã·ããšã³ãã³ã¹ã¡ã³ããªã©ã®ããªãšãŒã·ã§ã³ããå¥ã®ãã¡ã€ã«ãå¿ èŠãšããã«ç®¡çããã®ã«æé©ã§ãã
äŸ1ïŒããŒãããŒã¹ã®ã¬ã€ã€ãŒïŒã©ã€ã/ããŒã¯ã¢ãŒãïŒ
ããŒã¯ã¢ãŒãã®äžæžããå«ããã¹ãŠã®èŠèŠçãªããŒãèšå®ãåŠçããããã«ãå°çšã®themeã¬ã€ã€ãŒãäœæããŸãããã
@layer base, theme, components;
@layer theme {
// ããã©ã«ãïŒã©ã€ãããŒãïŒã®å€æ°
:root {
--background-primary: #ffffff;
--text-primary: #212121;
--accent-color: #007bff;
}
// ããŒã¯ããŒãã®äžæžãããŠãŒã¶ãŒã®å¥œã¿ã«å¿ããŠã¢ã¯ãã£ããŒã
@media (prefers-color-scheme: dark) {
:root {
--background-primary: #121212;
--text-primary: #eeeeee;
--accent-color: #64b5f6;
}
}
}
ããã§ã¯ãããŒãé¢é£ã®ãã¹ãŠã®ããžãã¯ãthemeã¬ã€ã€ãŒå ã«ãããã«ã«ãã»ã«åãããŠããŸããããŒã¯ã¢ãŒãã®ã¡ãã£ã¢ã¯ãšãªãã¢ã¯ãã£ãã«ãªããšããã®ã«ãŒã«ãé©çšãããŸããããããã¯äŸç¶ãšããŠthemeã¬ã€ã€ãŒã®åªå 床ã¬ãã«ã§åäœããŸãã
äŸ2ïŒããã°ã¬ãã·ããšã³ãã³ã¹ã¡ã³ãã®ããã®æ©èœãµããŒãã¬ã€ã€ãŒ
@supportsã«ãŒã«ã¯ãããã°ã¬ãã·ããšã³ãã³ã¹ã¡ã³ãã®ããã®åŒ·åãªããŒã«ã§ãããããã¬ã€ã€ãŒå ã§äœ¿çšããŠããµããŒãããŠãããã©ãŠã¶ã«ã®ã¿é«åºŠãªã¹ã¿ã€ã«ãé©çšããä»ã®ãã©ãŠã¶ã«ã¯å å®ãªãã©ãŒã«ããã¯ãä¿èšŒããããšãã§ããŸãã
@layer base, components, enhancements;
@layer components {
// ãã¹ãŠã®ãã©ãŠã¶åãã®ãã©ãŒã«ããã¯ã¬ã€ã¢ãŠã
.card-grid {
display: flex;
flex-wrap: wrap;
}
}
@layer enhancements {
// CSS Gridãµãã°ãªããããµããŒããããã©ãŠã¶åãã®é«åºŠãªã¬ã€ã¢ãŠã
@supports (grid-template-columns: subgrid) {
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
/* ä»ã®é«åºŠãªã°ãªãããããã㣠*/
}
}
// backdrop-filterããµããŒããããã©ãŠã¶åãã®ã¹ã¿ã€ã«
@supports (backdrop-filter: blur(10px)) {
.modal-overlay {
background-color: rgba(0, 0, 0, 0.3);
backdrop-filter: blur(10px);
}
}
}
enhancementsã¬ã€ã€ãŒã¯componentsã®åŸã«å®çŸ©ãããŠããããããã©ãŠã¶ããã®æ©èœããµããŒãããŠããå Žåããã®ã«ãŒã«ã¯ãã©ãŒã«ããã¯ã¹ã¿ã€ã«ãæ£ããäžæžãããŸããããã¯ããã°ã¬ãã·ããšã³ãã³ã¹ã¡ã³ããå®è£ ããããã®ã¯ãªãŒã³ã§å ç¢ãªæ¹æ³ã§ãã
ãã¯ããã¯3ïŒJavaScriptã«ããæ¡ä»¶ä»ãã¢ã¯ãã£ããŒã·ã§ã³ïŒäžçŽïŒ
æã«ã¯ãäžé£ã®ã¹ã¿ã€ã«ãã¢ã¯ãã£ããŒãããæ¡ä»¶ãCSSã«ã¯å©çšã§ããªãããšããããŸããããã¯ããŠãŒã¶ãŒèªèšŒãA/Bãã¹ãã®ããªã¢ã³ãããŸãã¯çŸåšããŒãžã«ã¬ã³ããªã³ã°ãããŠããåçã³ã³ããŒãã³ããªã©ãã¢ããªã±ãŒã·ã§ã³ã®ç¶æ ã«äŸåããå ŽåããããŸãããã®ãããªå ŽåãJavaScriptã¯ãã®ã®ã£ãããåããã®ã«æé©ãªããŒã«ã§ãã
éèŠãªã®ã¯ãCSSã§ã¬ã€ã€ãŒã®é åºãäºåã«å®çŸ©ããŠããããšã§ããããã«ããã«ã¹ã±ãŒãã®æ§é ã確ç«ãããŸãããã®åŸãJavaScriptã¯ç¹å®ã®äºåå®çŸ©ãããã¬ã€ã€ãŒã®CSSã«ãŒã«ãå«ã<style>ã¿ã°ãåçã«æ¿å ¥ã§ããŸãã
äŸïŒã管çè ã¢ãŒããããŒãã¬ã€ã€ãŒã®èªã¿èŸŒã¿
管çè ã远å ã®UIèŠçŽ ããããã°çšã®å¢çç·ãèŠãã³ã³ãã³ã管çã·ã¹ãã ãæ³åããŠãã ããããããã®ã¹ã¿ã€ã«çšã«å°çšã®ã¬ã€ã€ãŒãäœæãã管çè ããã°ã€ã³ããŠããå Žåã«ã®ã¿ããããæ¿å ¥ããããšãã§ããŸãã
// main.css - æœåšçãªã¬ã€ã€ãŒã®é åºããã¹ãŠç¢ºç«
@layer reset, base, components, admin-mode, utilities;
// app.js - ã¹ã¿ã€ã«ãæ¿å
¥ããããžãã¯
function initializeAdminMode(user) {
if (user.role === 'admin') {
const adminStyles = document.createElement('style');
adminStyles.id = 'admin-styles';
adminStyles.textContent = `
@layer admin-mode {
[data-editable] {
outline: 2px dashed hotpink;
position: relative;
}
[data-editable]::after {
content: 'Editable';
position: absolute;
top: -20px;
left: 0;
background-color: hotpink;
color: white;
font-size: 12px;
padding: 2px 4px;
}
}
`;
document.head.appendChild(adminStyles);
}
}
ãã®ã·ããªãªã§ã¯ãadmin-modeã¬ã€ã€ãŒã¯äžè¬ãŠãŒã¶ãŒã«ãšã£ãŠã¯ç©ºã§ãããããã管çè ãŠãŒã¶ãŒã«å¯ŸããŠinitializeAdminModeãåŒã³åºããããšãJavaScriptã¯ãã®äºåå®çŸ©ãããã¬ã€ã€ãŒã«çŽæ¥ã¹ã¿ã€ã«ãæ¿å ¥ããŸããadmin-modeã¯componentsã®åŸã«å®çŸ©ãããŠããããããã®ã¹ã¿ã€ã«ã¯é«ã詳现床ã®ã»ã¬ã¯ã¿ãå¿ èŠãšããã«ãåºæ¬ã³ã³ããŒãã³ãã®ã¹ã¿ã€ã«ãç°¡åãã€äºæž¬å¯èœã«äžæžãã§ããŸãã
ãã¹ãŠããŸãšããïŒå®è·µçãªã°ããŒãã«ã·ããªãª
ã°ããŒãã«ãªeã³ããŒã¹ãµã€ãã®ååããŒãžãšããè€éãªã³ã³ããŒãã³ãã®ããã®CSSã¢ãŒããã¯ãã£ãèšèšããŠã¿ãŸãããããã®ããŒãžã¯ã¬ã¹ãã³ã·ãã§ãããããŒãèšå®ããµããŒãããã¯ãªãŒã³ãªå°å·ãã¥ãŒãæäŸããæ°ãããã¶ã€ã³ã®A/Bãã¹ãçšã®ç¹å¥ã¢ãŒããæã€å¿ èŠããããŸãã
ã¹ããã1ïŒãã¹ã¿ãŒã¬ã€ã€ãŒã®é åºãå®çŸ©ãã
ãŸããã¡ã€ã³ã®ã¹ã¿ã€ã«ã·ãŒãã§ãã¹ãŠã®æœåšçãªã¬ã€ã€ãŒãå®çŸ©ããŸãããããç§ãã¡ã®ã¢ãŒããã¯ãã£ã®èšèšå³ã§ãã
@layer reset, // CSSãªã»ãã base, // ã°ããŒãã«ãªèŠçŽ ã¹ã¿ã€ã«ããã©ã³ããªã© theme, // ããŒã倿°ïŒã©ã€ã/ããŒã¯ãªã©ïŒ layout, // ã¡ã€ã³ããŒãžã®æ§é ïŒã°ãªãããã³ã³ããïŒ components, // åå©çšå¯èœãªã³ã³ããŒãã³ãã¹ã¿ã€ã«ïŒãã¿ã³ãã«ãŒãïŒ page-specific, // ååããŒãžåºæã®ã¹ã¿ã€ã« ab-test, // A/Bãã¹ãããªã¢ã³ãã®äžæžã print, // å°å·å°çšã®ã¹ã¿ã€ã« utilities; // åªå 床ã®é«ããŠãŒãã£ãªãã£ã¯ã©ã¹
ã¹ããã2ïŒã¬ã€ã€ãŒã«æ¡ä»¶ä»ãããžãã¯ãå®è£ ãã
次ã«ããããã®ã¬ã€ã€ãŒã«ãå¿ èŠã«å¿ããŠæ¡ä»¶ä»ãã«ãŒã«ã䜿çšããŠå 容ãèšè¿°ããŠãããŸãã
// --- ããŒãã¬ã€ã€ãŒ ---
@layer theme {
:root { --text-color: #333; }
@media (prefers-color-scheme: dark) {
:root { --text-color: #eee; }
}
}
// --- ã¬ã€ã¢ãŠãã¬ã€ã€ãŒïŒã¢ãã€ã«ãã¡ãŒã¹ãïŒ ---
@layer layout {
.product-page { display: flex; flex-direction: column; }
@media (min-width: 900px) {
.product-page { flex-direction: row; }
}
}
// --- å°å·ã¬ã€ã€ãŒ ---
@layer print {
@media print {
header, footer, .buy-button {
display: none;
}
.product-image, .product-description {
width: 100%;
page-break-inside: avoid;
}
}
}
ã¹ããã3ïŒJavaScripté§åã®ã¬ã€ã€ãŒãåŠçãã
A/Bãã¹ãã¯JavaScriptã«ãã£ãŠå¶åŸ¡ãããŸãããŠãŒã¶ãŒããnew-designãããªã¢ã³ãã«å±ããŠããå Žåãab-testã¬ã€ã€ãŒã«ã¹ã¿ã€ã«ãæ¿å ¥ããŸãã
// A/Bãã¹ãããžãã¯å
if (user.abVariant === 'new-design') {
const testStyles = document.createElement('style');
testStyles.textContent = `
@layer ab-test {
.buy-button {
background-color: limegreen;
transform: scale(1.1);
}
.product-title {
font-family: 'Georgia', serif;
}
}
`;
document.head.appendChild(testStyles);
}
ãã®ã¢ãŒããã¯ãã£ã¯éåžžã«å ç¢ã§ããå°å·ã¹ã¿ã€ã«ã¯å°å·æã«ã®ã¿é©çšãããŸããããŒã¯ã¢ãŒãã¯ãŠãŒã¶ãŒã®å¥œã¿ã«åºã¥ããŠã¢ã¯ãã£ããŒããããŸããA/Bãã¹ãã®ã¹ã¿ã€ã«ã¯äžéšã®ãŠãŒã¶ãŒã«ã®ã¿èªã¿èŸŒãŸããab-testã¬ã€ã€ãŒãcomponentsã®åŸã«æ¥ãããããã®ã«ãŒã«ã¯ããã©ã«ãã®ãã¿ã³ãã¿ã€ãã«ã®ã¹ã¿ã€ã«ã楜ã«äžæžãããŸãã
ã¡ãªãããšãã¹ããã©ã¯ãã£ã¹
æ¡ä»¶ä»ãã¬ã€ã€ãŒæŠç¥ãæ¡çšããããšã¯å€§ããªå©ç¹ããããããŸããããã®å¹æãæå€§åããããã«ã¯ãã¹ããã©ã¯ãã£ã¹ã«åŸãããšãéèŠã§ãã
äž»ãªã¡ãªãã
- ããã©ãŒãã³ã¹ã®åäžïŒãã©ãŠã¶ãæªäœ¿çšã®CSSã«ãŒã«ãè§£æããã®ãé²ãããšã§ãåæã®ã¬ã³ããªã³ã°ãããã¯æéãççž®ããããéãã¹ã ãŒãºãªãŠãŒã¶ãŒäœéšã«ã€ãªãããŸãã
- ä¿å®æ§ã®åäžïŒã¹ã¿ã€ã«ã¯ãæå±ããã³ã³ããŒãã³ãã ãã§ãªãããã®ã³ã³ããã¹ããšç®çã«ãã£ãŠæŽçãããŸããããã«ãããã³ãŒãããŒã¹ãçè§£ããããããããã°ãããããã¹ã±ãŒã«ãããããªããŸãã
- äºæž¬å¯èœãªè©³çŽ°åºŠïŒæç¢ºãªã¬ã€ã€ãŒã®é åºã詳现床ã®è¡çªãæé€ããŸããã©ã®ã¬ã€ã€ãŒã®ã¹ã¿ã€ã«ãåªå ãããããåžžã«ããããããå®å šãã€èªä¿¡ãæã£ãŠäžæžãã§ããŸãã
- ã¯ãªãŒã³ãªã°ããŒãã«ã¹ã³ãŒãïŒã¬ã€ã€ãŒã¯ãã¹ã³ãŒããæ±æãããã³ã³ããŒãã³ãã¬ãã«ã®ã¹ã¿ã€ã«ãšè¡çªãããããããšãªããã°ããŒãã«ãªã¹ã¿ã€ã«ïŒããŒããã¬ã€ã¢ãŠããªã©ïŒã管çããããã®æ§é åãããæ¹æ³ãæäŸããŸãã
ãã¹ããã©ã¯ãã£ã¹
- å®å šãªã¬ã€ã€ãŒã®é åºãäºåã«å®çŸ©ããïŒåžžã«ãã¡ã€ã³ã®ã¹ã¿ã€ã«ã·ãŒãã®å é ã«ããåäžã®@layerã¹ããŒãã¡ã³ãã§ããã¹ãŠã®æœåšçãªã¬ã€ã€ãŒã宣èšããŸããããã«ãããã¢ããªã±ãŒã·ã§ã³å šäœã®ã«ã¹ã±ãŒãé åºã«é¢ããå¯äžã®ä¿¡é Œã§ããæ å ±æºãäœæãããŸãã
- ã¢ãŒããã¯ãã£çã«èããïŒãã€ã¯ãã¬ãã«ã®ã³ã³ããŒãã³ãã®ããªã¢ã³ãã§ã¯ãªããåºç¯ãªã¢ãŒããã¯ãã£äžã®é¢å¿äºïŒãªã»ãããããŒã¹ãããŒããã¬ã€ã¢ãŠãïŒã«ã¬ã€ã€ãŒã䜿çšããŸããåäžã³ã³ããŒãã³ãã®å°ããªããªãšãŒã·ã§ã³ã«ã¯ãåŸæ¥ã®ã¯ã©ã¹ã®æ¹ãäŸç¶ãšããŠè¯ãéžæã§ããããšãå€ãã§ãã
- ã¢ãã€ã«ãã¡ãŒã¹ãã®ã¢ãããŒããåãå ¥ããïŒã¢ãã€ã«ãã¥ãŒããŒãåãã®åºæ¬ã¹ã¿ã€ã«ãã¬ã€ã€ãŒå ã§å®çŸ©ããŸããæ¬¡ã«ãåãã¬ã€ã€ãŒãŸãã¯åŸç¶ã®ã¬ã€ã€ãŒå ã§@media (min-width: ...)ã¯ãšãªã䜿çšããŠããã倧ããªç»é¢çšã®ã¹ã¿ã€ã«ã远å ãŸãã¯äžæžãããŸãã
- ãã«ãããŒã«ã掻çšããïŒCSSãåŠçããããã«çŸä»£ã®ãã«ãããŒã«ã䜿çšããŸããããã«ããã@importã¹ããŒãã¡ã³ããæ£ãããã³ãã«ãããã³ãŒããæå°åããããã©ãŠã¶ãžã®æé©ãªé ä¿¡ãä¿èšŒãããŸãã
- ã¬ã€ã€ãŒæŠç¥ãææžåããïŒå ±åãããžã§ã¯ãã§ã¯ãæç¢ºãªææžåãäžå¯æ¬ ã§ããåã¬ã€ã€ãŒã®ç®çãã«ã¹ã±ãŒãã«ããããã®äœçœ®ããããŠãããã¢ã¯ãã£ããŒããããæ¡ä»¶ã説æããã¬ã€ããäœæããŸãã
çµè«ïŒCSSã¢ãŒããã¯ãã£ã®æ°æä»£
CSSã«ã¹ã±ãŒãã¬ã€ã€ãŒã¯ãåãªã詳现床ã管çããããã®æ°ããããŒã«ä»¥äžã®ãã®ã§ããããã¯ãããã€ã³ããªãžã§ã³ãã§ãåçã§ãããã©ãŒãã³ã¹ã®é«ãã¹ã¿ã€ã«èšè¿°æ¹æ³ãžã®å ¥ãå£ã§ããã¬ã€ã€ãŒãã¡ãã£ã¢ã¯ãšãªããµããŒãã¯ãšãªããŸãã¯JavaScriptãä»ããæ¡ä»¶ä»ãããžãã¯ãšçµã¿åãããããšã§ããŠãŒã¶ãŒãšãã®ç°å¢ã«å®ç§ã«é©å¿ããã³ã³ããã¹ã察å¿ã®ã¹ã¿ã€ãªã³ã°ã·ã¹ãã ãæ§ç¯ã§ããŸãã
ãã®ã¢ãããŒãã¯ãäžæå²©ã§ç»äžçãªã¹ã¿ã€ã«ã·ãŒããããããå€ç§çã§å¹ççãªæ¹æ³è«ãžãšç§ãã¡ãç§»è¡ãããŸããããã¯éçºè ããç¡é§ããªããé«éã§ãä¿å®ããã®ã楜ãããã°ããŒãã«ãªãªãŒãã£ãšã³ã¹åãã®è€éã§æ©èœè±å¯ãªã¢ããªã±ãŒã·ã§ã³ãäœæããåãäžããŸããæ¬¡ã®ãããžã§ã¯ãã«çæããéã«ã¯ãæ¡ä»¶ä»ãã¬ã€ã€ãŒæŠç¥ãã©ã®ããã«ããŠããªãã®CSSã¢ãŒããã¯ãã£ãåäžãããããšãã§ããããæ€èšããŠã¿ãŠãã ãããã¹ã¿ã€ãªã³ã°ã®æªæ¥ã¯ãåã«æŽçãããŠããã ãã§ãªããã³ã³ããã¹ãã«å¯Ÿå¿ããŠããã®ã§ãã